<?php

namespace JsonLowCode\UI;

use Closure;
use JsonLowCode\Schema;
use JsonLowCode\Traits\Props\HasAutofocus;
use JsonLowCode\Traits\Props\HasBordered;
use JsonLowCode\Traits\Props\HasClearable;
use JsonLowCode\Traits\Props\HasDefaultValue;
use JsonLowCode\Traits\Props\HasDisabled;
use JsonLowCode\Traits\Props\HasLoading;
use JsonLowCode\Traits\Props\HasModel;
use JsonLowCode\Traits\Props\HasModelValue;
use JsonLowCode\Traits\Props\HasReadonly;
use JsonLowCode\Traits\Props\HasTinySize;
use JsonLowCode\Traits\Props\HasValue;
use JsonLowCode\Traits\Slots\HasSlotPrefix;
use JsonLowCode\Traits\Slots\HasSlotSuffix;

/**
 * InputNumber组件
 * @method static InputNumber make(string $type = 'text', mixed $value = null) Input组件
 */
class InputNumber extends Schema
{

    protected string $componentName = "NInputNumber";

    use HasClearable, HasDisabled, HasDefaultValue, HasLoading, HasReadonly, HasModelValue;

    use HasTinySize, HasBordered, HasAutofocus, HasValue;

    use HasSlotPrefix, HasSlotSuffix;


    public function __construct(mixed $value = null)
    {
        parent::__construct();
        $this->clearable();
        $value && $this->defaultValue($value);
    }

//    /**
//     * 设置组件 v-model:value
//     * @param string $bindValue
//     * @param Closure|null $closure
//     * @return $this
//     */
//    public function modelValue(string $bindValue,  Closure $closure = null): static
//    {
//        return $this->bindModel("value", $bindValue, $closure);
//    }
//
//    /**
//     * @param mixed $value
//     * @param bool $isJSExpression
//     * @param Closure|null $closure
//     * @return $this
//     */
//    public function onUpdateValue(mixed $value, bool $isJSExpression = false,  Closure $closure = null): static
//    {
//        return $this->onUpdateModel("value", $value, $isJSExpression, $closure);
//    }


    /**
     * 设置输入框验证状态
     * @param string $status 输入框验证状态 'success' | 'warning' | 'error'
     * @return $this
     */
    public function status(string $status = 'success' | 'warning' | 'error'): static
    {
        return $this->prop("status",$status);
    }

    /**
     * 文本输入的占位符 如果 pair 是 true，placeholder是一个数组
     * @param string|array $placeholder
     * @return $this
     */
    public function placeholder(string|array $placeholder = ''): static
    {
        return $this->prop("placeholder",$placeholder);
    }


    /**
     * 是否有按钮
     * @param string|bool $bool
     * @return $this
     */
    public function showButton(string|bool $bool = true): static
    {
        return $this->prop("show-button",$bool);
    }

    /**
     * 数值保留的精度值，设定后会禁用 update-value-on-input
     * @param string|int $precision
     * @return $this
     */
    public function precision(string|int $precision = 0): static
    {
        return $this->prop("precision",$precision);
    }

    /**
     * 在输入的过程中，在输入值合法的情况下，是否改变值
     * @param string|bool $bool
     * @return $this
     */
    public function updateValueOnInput(string|bool $bool = true): static
    {
        return $this->prop("update-value-on-input",$bool);
    }

    /**
     * 每次改变步数，可以为小数
     * @param string|int|float $step
     * @return $this
     */
    public function step(string|int|float $step = 1): static
    {
        return $this->prop("step",$step);
    }

    /**
     * 最小值
     * @param string|int|float $min
     * @return $this
     */
    public function min(string|int|float $min = 0): static
    {
        return $this->prop("min",$min);
    }

    /**
     * 最大值
     * @param string|int|float $max
     * @return $this
     */
    public function max(string|int|float $max = 100): static
    {
        return $this->prop("max",$max);
    }


    /**
     * 加减按钮的位置
     * @param string $placement 'both' | 'right'
     * @return $this
     */
    public function buttonPlacement(string $placement = 'both' | 'right'): static
    {
        return $this->prop("button-placement",$placement);
    }

    /**
     * 格式化值的方法，设定后会禁用 update-value-on-input
     * @param string $format (value: number | null) => string
     * @return $this
     */
    public function format(string $format): static
    {
        return $this->events('format', $format);
    }

    /**
     * 设置组件是否支持键盘操作
     * @param bool|string|array $bool { ArrowUp?: boolean, ArrowDown?: boolean } | false
     * @return $this
     */
    public function keyboard(bool|string|array $bool = false): static
    {
        return $this->prop('keyboard', $bool);
    }

    /**
     * 解析输入的字符串，设定后会禁用 update-value-on-input
     * @param string $parse (input: string) => number | null
     * @return $this
     */
    public function parse(string $parse): static
    {
        return $this->events('parse', $parse);
    }


    /**
     * 输入框获得焦点时触发
     * @param string $event 函数字符串 () => void
     * @return $this
     */
    public function onFocus(string $event = ""): static
    {
        return $this->events("onFocus",$event);
    }

    /**
     * 输入框失去焦点时触发
     * @param string $event 函数字符串 () => void
     * @return $this
     */
    public function onBlur(string $event = ""): static
    {
        return $this->events("onBlur",$event);
    }

    /**
     * 输入框点击清空按钮时触发
     * @param string $event 函数字符串 () => void
     * @return $this
     */
    public function onClear(string $event = ""): static
    {
        return $this->events("onClear",$event);
    }

    /**
     * 增加按钮的图标
     * @param mixed $icon 是否是js表达式
     * @param array $params
     * @return $this
     */
    public function slotAddIcon(mixed $icon, array $params = []): static
    {
        return $this->slot('add-icon', $icon,$params);
    }

    /**
     * 减少按钮的图标
     * @param mixed $icon 是否是js表达式
     * @param array $params
     * @return $this
     */
    public function slotMinusIcon(mixed $icon, array $params = []): static
    {
        return $this->slot('minus-icon', $icon,$params);
    }

    /**
     * 设置自定义验证
     * @param mixed $event (value) => boolean 是否是js表达式
     * @return $this
     */
    public function validator(mixed $event): static
    {
        return $this->events('validator', $event);
    }

}
